package com.atguigu.gmall.activity.service;

import com.atguigu.gmall.model.activity.ActivityRule;
import com.atguigu.gmall.model.activity.CouponInfo;
import com.atguigu.gmall.model.activity.CouponRuleVo;
import com.atguigu.gmall.model.cart.CartInfo;
import com.atguigu.gmall.model.order.OrderDetail;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
 * @author atguigu-mqx
 */
public interface CouponInfoService extends IService<CouponInfo> {

    /**
     * 查询优惠券列表
     * @param pageParam
     * @return
     */
    IPage<CouponInfo> getPage(Page<CouponInfo> pageParam);

    /**
     * 保存优惠券对应的规则
     * @param couponRuleVo
     */
    void saveCouponRule(CouponRuleVo couponRuleVo);

    /**
     * 根据优惠券的Id 做数据回显
     * @param id
     * @return
     */
    Map<String, Object> findCouponRuleList(Long id);

    /**
     * 根据关键字查询优惠券列表
     * @param keyword
     * @return
     */
    List<CouponInfo> findCouponByKeyword(String keyword);

    /**
     * 根据skuId, userId 获取到优惠券列表
     * @param skuId
     * @param userId
     * @return
     */
    List<CouponInfo> findCouponInfo(Long skuId,Long userId);


    /**
     * 根据userId 查询带分页的数据记录
     * @param couponInfoPage
     * @param userId
     * @return
     */
    IPage<CouponInfo> getPageByUserId(Page<CouponInfo> couponInfoPage, Long userId);


    /**
     * 优惠券列表
     * @param cartInfoList 购物车中所有的购物项
     * @param skuIdToActivityIdMap  skuId 对应的活动Id
     * @param userId    表示当前用户是否领取优惠券
     * @return
     */
    Map<Long ,List<CouponInfo>> findCartCouponInfo(List<CartInfo> cartInfoList,Map<Long,Long> skuIdToActivityIdMap, Long userId);


    /**
     *
     * @param orderDetailList
     * @param activityIdToActivityRuleMap
     * @param userId
     * @return
     */
    List<CouponInfo> findTradeCouponInfo(List<OrderDetail> orderDetailList, Map<Long, ActivityRule> activityIdToActivityRuleMap,Long userId);

    /**
     * 更新优惠券的使用状态！
     * @param couponId
     * @param userId
     * @param orderId
     */
    void updateCouponInfoUseStatus(Long couponId, Long userId, Long orderId);
}
